package com.wjm.shootgame.shoot;

import java.awt.*;
import java.awt.image.BufferedImage;
/*
*
* 飞行物的基类（父类，超类）
* 用于重构子类公共的代码，子类只需要继承该类就可以获取该类的属性
*
* */
public abstract class FlyingObject {

    //设置飞机状态
    public int state = LIVE;
    public static final int LIVE = 0;//活着状态
    public static final int DEAD = 1;//死掉状态
    public static final int REMOVE = 2;//可以从内存中移除状态

    //大小
    public int width;
    public int height;
    //位置
    public int x;
    public int y;


    //适用于英雄类的，天空类，子弹类的构造方法
    public FlyingObject(int x,int y,int width,int height){
        this.width=width;
        this.height=height;
        this.x=x;
        this.y=y;

    }
    //适用于敌机的构造方法
    public FlyingObject(int width,int height){
        this.width=width;
        this.height=height;
        this.x=(int)(Math.random()*(World.WIDTH-this.width));
        this.y= -this.height;

    }


    /**
     * 获取图片的抽象方法
     * @return
     */
    public abstract BufferedImage getImage();  //BufferedImage是java提供的一种图片类

    /**
     * 飞行物移动的抽象方法
     */
    public abstract void move();

    /**
     * 判断是否越界的方法
     * @return 越界返回true，没越界返回false
     */
    public abstract boolean isOutBound();

    /**
     * 封装了一个画画的方法
     * @param g 相当于是画笔
     */
    public void paintImage(Graphics g){
        g.drawImage(this.getImage(),this.x,this.y,null);
    }

    /**
     * 判断是否发生碰撞的方法
     * @param other 传进来一个飞行物的对象
     * @return 发生碰撞返回true，否则返回false
     */
    public boolean isHat(FlyingObject other){
        int x1 = this.x - other.width;
        int y1 = this.y - other.height;
        int x2 = this.x + this.width;
        int y2 = this.y + this.height;
        if (other.x>x1 && other.x<x2 && other.y>y1 && other.y<y2 ){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 让飞行物死去的方法
     */
    public void goDead(){
        this.state = DEAD;
    }

    /**
     * 判断飞行物是否活着
     * @return 活着返回true
     */
    public boolean isLive(){
        if (this.state == LIVE){
            return true;
        }else {return false;}
    }

    /**
     * 判断飞行物是否死了
     * @return 死了返回true
     */
    public boolean isDead(){
        if (this.state == DEAD){
            return true;
        }else {return false;}
    }

    /**
     * 判断飞行物是否可移除
     * @return 可移除返回true
     */
    public boolean isRemove(){
        if (this.state == REMOVE){
            return true;
        }else {return false;}
    }

}
